<script>
	import {
		eventBus
	} from './utils/eventBus.js';
	export default {
		data() {
			return {
				messages: [], // 存储消息的数组
				user: {
					reconnectInterval: 1000, // 初始重连间隔1秒
					reconnecting: false,
					reconnectTimer: null,
					socket: null
				},
				token: uni.getStorageSync('token')
			};
		},
		onLaunch: function() {
			if (this.token) {
				this.initWebSocket(this.token);
			}else{
				console.log("无token 不初始化websocket")
			}
			 // 监听登录成功事件
			eventBus.on('login-success', this.handleLoginSuccess)
			console.log('App Launch');
		},
		onShow: function() {
			console.log('App Show');
		},
		onHide: function() {
			console.log('App Hide');
		},
		methods: {
			// 登录成功处理
			    handleLoginSuccess({ token }) {
			      // 关闭旧连接（如果存在）
			      if (this.user.socket) {
			        this.user.socket.close()
			        this.clearReconnectTimer(this.user)
			      }
			      
			      // 存储新 token
			      uni.setStorageSync('token', token)
			      this.token = token
			      
			      // 初始化新连接
			      this.initWebSocket(token)
			    },
			initWebSocket(token) {
				const socketTask = uni.connectSocket({
					// url: `wss://xit-edu.cn/ws/endpoint/${token}`,
					url: `ws://localhost:52503/ws/endpoint/${token}`,
					success: () => {
						console.log(`websocket连接创建成功`);
					}
				});

				this.user.socket = socketTask;

				// 连接打开时的处理
				socketTask.onOpen(() => {
					console.log(`系统：websocket连接成功`);
					// 连接成功后重置重连间隔
					this.user.reconnectInterval = 1000;
					this.user.reconnecting = false;
				});

				// 接收消息处理（保持原有逻辑）
				socketTask.onMessage((res) => {
					console.log(res)
					const data = JSON.parse(res.data);
						eventBus.emit('custom-event', {
							data: data
						}, );
					try {
						
						console.log(`收到 ${data.fromUserId} 的消息：${data.content}`);
					} catch(e) {
						
						console.log(e);
					}
				});

				// 错误处理，触发重连
				socketTask.onError((err) => {
					console.log(`系统：连接出错，准备重连...`);
					this.startReconnect(this.user, socketTask);
				});

				// 连接关闭处理，触发重连（非主动关闭时）
				socketTask.onClose((res) => {
					if (res.code !== 1000) { // 1000是正常关闭代码
						if (res.code == 10086 || res.code == 10087 || res.code == 10088) {
							uni.showToast({
								title: "登录已过期"
							})
							uni.reLaunch({
								url: "/pages/login/login"
							})
							return
						}
						console.log(`系统： 连接断开，状态码：${res.code}，准备重连...1${JSON.stringify(res)}`);
						this.startReconnect(this.user, socketTask);
					} else {
						console.log(`系统： 连接已正常关闭`);
					}
				});
			},
			// 启动重连逻辑
			startReconnect(user, oldSocket) {
				if (user.reconnecting || !this.token) return; // 避免重复重连或无token时重连

				// 清除旧连接
				oldSocket?.close();
				user.socket = null;

				user.reconnecting = true;
				// 使用指数退避算法计算重连间隔
				const maxInterval = 30000; // 最大重连间隔30秒
				user.reconnectInterval = Math.min(user.reconnectInterval * 2, maxInterval);

				user.reconnectTimer = setTimeout(() => {
					console.log(
						`系统：尝试第${this.getReconnectCount(user)}次重连（间隔${user.reconnectInterval / 1000}秒）`);
					this.initWebSocket(this.token); // 重新初始化连接
					user.reconnecting = false;
				}, user.reconnectInterval);
			},

			// 获取重连次数（通过定时器ID的时间戳计算，这里简化处理）
			getReconnectCount(user) {
				return Math.floor(Math.log2(user.reconnectInterval / 1000)) + 1;
			},

			// 清除重连定时器
			clearReconnectTimer(user) {
				clearTimeout(user.reconnectTimer);
				user.reconnectTimer = null;
				user.reconnecting = false;
			},

			// 发送消息的方法
			sendMessage(msgData) {
				if (this.user.socket && !this.user.reconnecting) {
					this.user.socket.send({
						data: JSON.stringify(msgData),
						success: () => {
							console.log(`发送消息：${JSON.stringify(msgData)}`);
						},
						fail: (err) => {
							console.log(`发送消息失败：${err.errMsg}`);
							this.startReconnect(this.user, this.user.socket);
						}
					});
				} else {
					console.log('连接未就绪，无法发送消息');
				}
			},

		}
	};
</script>

<style>
	/* 全局样式 */
</style>